import json
import numpy as np
from sklearn.linear_model import LogisticRegression  # 使用逻辑回归模型进行预测

# 预测模型处理函数
def handle_prediction_model(data):
    try:
        # 生成结果的基础结构
        prediction_results = {"prediction_analysis": []}

        # 遍历 JSON 数组中的每个表格
        for table in data:
            table_name = table.get("tableName")
            rows = table.get("data")  # 获取数据行

            if not isinstance(rows, list):
                raise ValueError("数据字段 'data' 应该是一个列表")

            # 假设我们使用逻辑回归模型进行预测，这里我们训练一个简单的模型
            # 示例：预测设备的状态（基于 scan_rate 和 value 进行预测）
            # 在实际应用中，你可以使用更多特征进行训练

            # 准备训练数据，假设我们有历史的 scan_rate 和 value 值（我们简化为示例数据）
            # 实际数据应该来自于 `rows` 中的历史记录
            X_train = np.array([[100], [120], [130], [140], [150]])  # 示例数据
            y_train = np.array([1, 1, 0, 1, 0])  # 对应的标签，1 = 正常，0 = 故障

            # 使用逻辑回归模型进行拟合（训练）
            model = LogisticRegression()
            model.fit(X_train, y_train)

            # 遍历每一行数据进行预测
            for row in rows:
                # 确保 row 是字典类型
                if not isinstance(row, dict):
                    raise ValueError("每一行数据应该是一个字典")

                # 提取 scan_rate 和 value 等字段
                scan_rate = row.get("scan_rate")
                value = row.get("value")
                description = row.get("description")

                # 将 scan_rate 转为数字
                if scan_rate is not None:
                    scan_rate = int(scan_rate)

                # 如果 scan_rate 存在，则进行预测
                if scan_rate is not None:
                    # 预测设备状态：1 = 正常，0 = 故障
                    predicted_status = model.predict([[scan_rate]])[0]

                    # 将预测结果添加到输出
                    prediction_results["prediction_analysis"].append({
                        "tableName": table_name,
                        "id": row.get("id"),
                        "scan_rate": scan_rate,
                        "predicted_status": "正常" if predicted_status == 1 else "故障",
                        "description": description,
                        "value": value
                    })

        # 返回处理后的结果
        return json.dumps(prediction_results, ensure_ascii=False, indent=4)

    except Exception as e:
        return json.dumps({"error": str(e)})
